﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sauces.Bussinees.Entities.Compras;
using Sauces.Repository.Compras.Service;
using System.Data;


namespace Sauces.Repository.Compras
{
   public class PedidoProveedorRepository:MasterRepository,IPedidoProveedorRepository
    {

        public List<PedidoProveedor> getAllPedidoProveedor()
        {
            var query = from p in Context.PedidoProveedor.Include("Proveedor")
                        
                        select p;

            return query.ToList();
        }
        

        public PedidoProveedor getAllPedidoProveedorByNumero(int numero)
        {
            throw new NotImplementedException();
        }

        public PedidoProveedor getFromPedidoProveedorById(int id)
        {
            var query = from p in Context.PedidoProveedor
                        .Include("Proveedor")
                        .Include("DetallePedidoProveedor.Producto")
                        where p.Id.Equals(id)
                        select p;
            return query.SingleOrDefault();
        }

        public void addPedidoProveedor(PedidoProveedor pedido)
        {
            Context.Entry(pedido.Proveedor).State=EntityState.Unchanged;

            foreach (var detalle in pedido.DetallePedidoProveedor)
            {
                Context.Entry(detalle.Producto).State = EntityState.Unchanged;

            }
            Context.PedidoProveedor.Add(pedido);
            Context.SaveChanges();          

        }

        public void upDatePedidoProveedor(PedidoProveedor pedido)
        {
            var pedidoDB = getFromPedidoProveedorById(pedido.Id);

            pedidoDB.Fecha = pedido.Fecha;
            pedidoDB.Total = pedido.Total;

            if (pedidoDB.IdProveedor != pedido.IdProveedor)
            {
                pedidoDB.IdProveedor = pedido.IdProveedor;
                pedido.Proveedor = pedido.Proveedor;

                Context.Entry(pedidoDB.Proveedor).State = EntityState.Unchanged;
            }

            var DetallesEliminados = new List<DetallePedidoProveedor>();

            foreach (var detalleDB in pedidoDB.DetallePedidoProveedor)
            {
                var eliminado = pedido.DetallePedidoProveedor.Where(dp => dp.item == detalleDB.item).SingleOrDefault();

                if (eliminado == null)
                {
                    DetallesEliminados.Add(detalleDB);
                }
                
            }

            foreach (var detEliminado in DetallesEliminados)
            {
                var eliminar = pedidoDB.DetallePedidoProveedor.Where(dp => dp.item == detEliminado.item).SingleOrDefault();
                pedidoDB.DetallePedidoProveedor.Remove(eliminar);
                
            }

            foreach (var detalle in pedido.DetallePedidoProveedor)
            {
                if (detalle.item == 0)
                {
                    Context.Entry(detalle.Producto).State = EntityState.Unchanged;
                    pedidoDB.DetallePedidoProveedor.Add(detalle);
                }
                else 
                {
                    var detalleDB = pedidoDB.DetallePedidoProveedor.Where(dp => dp.item == detalle.item).SingleOrDefault();
                    detalleDB.Cantidad = detalle.Cantidad;
                    detalleDB.Precio = detalle.Precio;

                    Context.Entry(detalleDB.Producto).State = EntityState.Unchanged;
                    Context.Entry(detalleDB).State = EntityState.Modified;
                }
                
            }
            Context.Entry(pedidoDB).State = EntityState.Modified;
            Context.SaveChanges();

        }

        public void removePedidoProveedor(int id)
        {
            var pedido = getFromPedidoProveedorById(id);

            Context.PedidoProveedor.Remove(pedido);
            Context.SaveChanges();
        }


        public List<PedidoProveedor> getAllPedidoProveedorByNombreAndRazonAndFechas(string nombre, DateTime? FInicio, DateTime? FFin)
        {
            var query = from p in Context.PedidoProveedor.Include("Proveedor")
                        select p;

            if (nombre != null && nombre != "")
            {
                query = from c in query
                        where c.Proveedor.Nombre.ToUpper().Contains(nombre.ToUpper()) ||
                        c.Proveedor.Apellidos.ToUpper().Contains(nombre.ToUpper()) ||
                        c.Proveedor.RazonSocial.ToUpper().Contains(nombre.ToUpper())
                        select c;
            }

            else if (FInicio.HasValue && FFin.HasValue)
            {
                query = from p in query
                        where p.Fecha >= FInicio && p.Fecha <= FFin
                        select p;
            }


            return query.ToList();
        }
    }
}
